.TITLE INITL .IDENT /17.11/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 23-AUG-73 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; B. S. MCCARTHY ; P. J. BEZEREDI ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. W. BERZLE ; J. M. LAWLER ; B. S. MCCARTHY ; M. PETTENGILL ; J. G. WEHNER ; P. K. M. WEISS ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY ; J. W. BERZLE ; L. B. MCCULLEY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY: ; ; B. S. MCCARTHY ; D. Carroll ; ; Modified for RSX-11M-PLUS Version 4.5 by: ; ; D. Carroll ; ; Modified for RSX-11M-PLUS Version 4.6 by: ; ; D. Carroll 18-Oct-1995 16.10 ; DC403 - Correct problem with size of space used ; if including both resident crash, and resident ; XDT. Conditionalize all of the mP support in ; the code. ; ; D. Carroll 28-Oct-1995 17.00 ; DC410 - Conditionalize for support with virtual disks and ; partitioned disks being booted ... ; ; D. Carroll 08-Jan-1996 17.10 ; DC430 - Include support for 32-bit LBN devices ; (Happy birthday, Ann!) ; ; D. Carroll 28-Jul-1997 17.11 ; DC483 - Correct selecting of alternate devices ; ; ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$ HWDDF$ ;DEFINE HARDWARE REGISTERS ; ; MACRO DEFINITIONS ; .MACRO BREAK TYPE .IF DF X$$DBT .WORD 3 .IFF HALT .ENDC .IF IDN , BR .-2 .ENDC .ENDM ; ; INITIALIZE PROPER BIT SETTING FOR SR3 ; S3$BTS==0 ;INIT TO NO BITS SET .IF DF M$$EXT S3$BTS==S3$BTS!60 ;ENABLE 22 BIT MODE AND UNIBUS MAP .ENDC .IF DF K$$DAS S3$BTS==S3$BTS!4 ;ENABLE KERNEL D SPACE .ENDC .IF DF S$$LIB S3$BTS==S3$BTS!2 ;ENABLE SUPERVISOR D SPACE .ENDC .IF DF U$$DAS S3$BTS==S3$BTS!1 ;ENABLE USER D SPACE .ENDC ; DF U$$DAS ; ; LOCAL DATA ; ; SYSTEM IDENTIFICATION MESSAGES ; .NLIST BEX SYSMG: .ASCII <15><177><177><12>/ V/ SYSVR: .ASCII / BL/ SYSID: .ASCIZ / /<15><12><12> MESS0: .ASCIZ /Directive partition not fixed in memory/ $MESS1::.ASCIZ /Executive data space not loaded/ .IF DF M$$PRO ;DC403 MESS2: .ASCIZ /No CPU partition created in MP system/ ;DC403 .ENDC ;DF,M$$PRO ;DC403 MESS3: .ASCII /Boot device not found in system tables:/ ;**-1 .BYTE 15,177,177,12 .ASCII /R0=device type (ASCII)/<15><177><177><12> .ASCII /R1=Physical unit number/<15><177><177><12> .ASCII /R2=CSR address/ .IF DF M$$PRO .ASCIZ <15><177><177><12>/R3=CPU ordinal/ .IFF .BYTE 0 .ENDC .EVEN MESS4: .ASCII /Device / XX: .ASCIZ /XX -- / MESS5: .ASCIZ /Driver not loaded/ MESS6: .ASCIZ /Driver does not support controller type/ MESS7: .ASCIZ /Vector address above V$$CTR/ MESS10: .ASCIZ /Vector in use/ .IF DF M$$PRO ;DC403 MESS11: .ASCIZ /Unibus run not accessible/ ;DC403 .ENDC ;DF,M$$PRO ;DC403 MESS12: .ASCIZ /Driver didn't return control after / ;**-1 MESS13: .ASCIZ /controller online call/ MESS14: .ASCIZ /unit online call/ MESS15: .ASCIZ /Driver error -- Please submit an SPR!/ ;DC403 .EVEN ;**-1 MESS16: .ASCII / controller / UU: .ASCIZ /UUAANN:/ MESS17: .ASCIZ /error code in R1/ MESS20: .ASCIZ /Unit / MESS21: .ASCIZ / didn't come online/ FILL: .ASCIZ <15><177><177><12> MESS22: .ASCIZ /Fatal error -- / MESS23: .ASCIZ /Secondary pool not created with VMR/ MESS24: .ASCIZ /Warning -- / .IF DF C$$CDA ;DC410 .IF NE C$$CDA ;DC410 MESS25: .ASCII /Crash device not found in system tables:/<15><177> .ASCII <177><12>/R0=device type (ASCII)/<15><177><177><12> .ASCII /R1=logical unit number/<15><177><177><12>/Enter/ .ASCII / CSR address in R2, physical unit number in R1/ .ASCII <15><177><177><12>/and / .IF DF X$$DBT .ASCII /type P/ .IFF .ASCII /hit continue/ .ENDC .ENDC ;DC403 .ENDC ;DC403 ;**-1 NULL: .BYTE 0 ;NOTE -- THIS MUST FOLLOW PREVIOUS TEXT CTLET: .ASCII /ABCDEFHJKLMNPRSTUVWXYZ/ .IF DF K$$DAS MESS26: .ASCIZ /ICB pool overmaps kernel APR1/ .ENDC ;DF,K$$DAS .IF DF V$$DSK ;DC410 MESS27: .ASCIZ /Device does not support partitions/ ;DC410 MESS28: .ASCIZ /Virtual device is nested too deep/ ;DC410 .IF NDF E$$LBN ;DC410 MESS29: .ASCIZ /Device is too big, requires 32-bit support/ ;DC410 .ENDC ;NDF,E$$LBN ;DC410 .IFF ;DF,V$$DSK ;DC410 MESS29: .ASCIZ "Virtual/partitioned drives not supported" ;DC410 .ENDC ;DF,V$$DSK ;DC410 .EVEN ; ; TABLE OF ERROR MESSAGES INDEXED BY GETVEC INITIAL CODE ; GETERR: .WORD MESS5 .WORD MESS6 .WORD MESS7 .WORD MESS10 .IF DF M$$PRO ;DC403 .WORD MESS11 ;DC403 .ENDC ;DF,M$$PRO ;DC403 PROMT: .ASCIZ <15><12>/>/ ; ;**-1 .EVEN ; ; DATA AREA FOR DATA-SPACE INITIALIZATION TABLE ; ; FORMAT OF THE TABLE IS: ; ; DTBL: .WORD ADDRESS ;ADDRESS FOR NEXT VALUE ; .WORD DATA ;DATA TO PLUG AT ABOVE ADDRESS ; ; . ; . ; . ; ; .WORD 0 ;ZERO IN ADDRESS POSITION TERMINATES TABLE ; .IF DF K$$DAS DTBL: ;REFERENCE LABEL .IF DF M$$PRO .WORD $IITBX ;INTERPROCESSOR INTERRUPT COMMON INT TBL .WORD $IIINT ;IIST INTERRUPT ADDRESS .WORD $IITBX+CI.PWF ;IIST COMMON INT TBL POWERFAIL ENTRY .WORD $IIPWF ;ENTRY POINT IN IIST MODULE .ENDC .IF DF R$$HDV .WORD $RHTBX ;RH COMMON INTERRUPT TABLE ADDRESS .WORD $RHALT ;RH COMMON INTERRUT ADDRESS .WORD $RHTBX+CI.KRB ;RH COMMON CONTROLLER ONLINE ENTRY .WORD $RHKRB ;ADDRESS OF RH CONTROLLER ONLINE ENTRY .WORD $RHTBX+CI.PWF ;RH COMMON POWERFAIL ENTRY .WORD $RHPWF ;ADDRESS OF RH POWERFAIL ENTRY .WORD $RHTBX+CI.CSR ;ADDRESS OF CSR TEST ENTRY .WORD $RHCSR ;RH CSR TEST ENTRY .ENDC .IF DF R$$611 .WORD $DMTBX ;DM COMMON INTERRUPT TABLE ADDRESS .WORD $DMALT ;DM COMMON INTERRUPT ADDRESS .WORD $DMTBX+CI.KRB ;DM CONTROLLER ONLINE/OFFLINE ENTRY .WORD $DMKRB ;DM CONTROLLER ENTRY ADDRESS .WORD $DMTBX+CI.PWF ;DM CONTROLLER POWERFAIL ENTRY .WORD $DMPWF ;DM CONTROLLER POWERFAIL ADDRESS .WORD $DMTBX+CI.CSR ;DM CONTROLLER CSR TEST ADDRESS .WORD $DMCSR ;CSR TEST ADDRESS .ENDC ; KERNEL AST TABLE ENTRIES ; KEEP THIS TABLE IN SYNCH WITH $KATBL IN SYSCM .WORD $KATBL+00,$FINBF ;AK.BUF - BUFFERED I/O .WORD $KATBL+02,$FINXT ;AK.OCB - OFFSPRING EXIT .WORD $KATBL+04,$GENBF ;AK.GBI - GENERAL BUFFERED I/O .WORD $KATBL+06,$DBTRP ;AK.TBT - FORCED T-BIT TRAP .WORD $KATBL+10,$FINDI ;AK.DIO - DELAYED I/O COMP. .WORD $KATBL+12,$GGFRN ;AK.GGF - GRP. GBL. RUNDWN. ; SPM VECTOR FOR ACP HOOKPOINT ENTRY .WORD $SPV01 .WORD $SPVEX ; AND LOADER HOOKPOINT ENTRIES .WORD $SPV02 .WORD $SPVEX .WORD $SPV03 .WORD $SPVEX ; ; LAT DISCONNECT CALL ENTRY POINT ; .IF DF M$$NET&T$$LTH .WORD $LTEEP .WORD $SPVEX .ENDC ; DF M$$NET&T$$LTH .WORD 0 ;END OF TABLE .ENDC ; ; TEMPORARY STORAGE AREA FOR $SYSIZ INFORMATION. ; (K$$DAS SYSTEMS ONLY) ; .IF DF K$$DAS $SYALT::.WORD 0,0,0,0,0 ;STORAGE FOR $SYSIZ .IF DF,E$$LBN ;DC430 .WORD 0 ;extra word for 32-bit device support ;DC430 .ENDC ;DF,E$$LBN ;DC430 .ENDC .LIST BEX .IF DF R$$PRO ; ; THIS ROUTINE IS TAKEN FROM THE MODULE POWER. IT IS ; HERE BECAUSE THE EXEC HAS NO POWER FAIL CODE OF ITS OWN. ; $POWER: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP. MOV #$SCDVT,-(SP) 30$: CALL @(SP)+ ;GET NEXT UCB ADDRESS BCC 40$ ;IF CC GOT ONE CLRB $PWRFL ;CPU POWERFAIL COMPLETE 35$: RETURN 40$: MOV #30$,-(SP) ;SET RETURN ADDRESS BITB #US.OFL,U.ST2(R5) ;DEVICE IN CONFIGURATION BNE 35$ ;IF NE DEVICE IS NOT IN CONFIG MOV S.KRB(R4),R2 ;GET KRB ADDRESS BEQ 45$ ;IF EQ NO KRB ADDRESS 44$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE? BNE 35$ ;IF NE YES 45$: BITB #UC.PWF,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITY? BNE 50$ ;IF NE YES TSTB U.STS(R5) ;IS UNIT ACTIVE? BPL 35$ ;IF PL NO 50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLE BEQ 35$ ;IF EQ DRIVER NOT LOADED CALLR $LDPWF ;CALL DRIVER AT POWERFAIL ENTRY .ENDC ; DF R$$PRO ;+ ; **-$INITL-SYSTEM TRANSFER ADDRESS ; ; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHEN ; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND START ; UP THE SYSTEM ;- $INITL::RESET ;RESET PROCESSOR MOV R0,@#46 ;SAVE BOOT DEVICE CSR ADDRESS MOV R3,@#50 ;AND ALSO PARTITION/VIRTUAL DEVICE INFO ;DC430 MOV #$SYALT+2,R0 ;POINT TO SYSTEM CONFIGURATION VECTOR ;DC430 MOVB R3,(R0)+ ;SAVE UNIT NUMBER ;DC430 .IF DF E$$LBN ;DC430 CLRB (R0)+ ; ZERO HIGH ORDER PORTION OF UNIT ;DC430 .IFF ;DF,E$$LBN ;DC430 MOVB R1,(R0)+ ;SAVE LBN OF LOAD IMAGE ;DC430 .IFTF ;DF,E$$LBN ;DC430 MOV R2,(R0)+ ; ;**-3 MOV R4,(R0)+ ;SAVE DEVICE NAME MOV R5,(R0)+ ;SAVE LENGTH OF LOAD FILE .IFT ;DF,E$$LBN ;DC430 MOV R1,(R0)+ ;SAVE FULL HIGH ORDER DEVICE LBN ;DC430 .ENDC ;DF,E$$LBN ;DC430 ;**-1 .IF DF M$$PRO JMP $PENT ;USE COMMON CODE IF AVAILABLE .IFF MOV #PMODE+PR7,PS ;SET MODE BITS AND LOCK OUT INTERRUPTS MOV #$STACK-20,SP ;SETUP EXEC STACK POINTER MOV #KINAR0,R5 ;INIT POINTER TO MAPPING REGISTERS CLR R1 ;INIT I SPACE MEMORY OFFSET .IF DF K$$DAS MOV $SCMOF,R2 ;INIT D SPACE MEMORY OFFSET BNE 3$ ;IF NE FOUND IT MOV #$MESS1,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL CALL $FATAL ;PREFACE WITH FATAL DESIGNATION BREAK FATAL ;IF D SPACE NOT LOADED HANG IT UP 3$: SUB #200,R2 ;ADJUST TO BE RIGHT FOR APR 1 BIT #^C<17777>,#$ICTOP ; IS ICB POOL TOO HIGH? BEQ 5$ ; IF EQ, NOPE, CONTINUE MOV #MESS26,R4 ; SET THE ERROR MESSAGE CALL $FATAL ;PREFACE WITH FATAL DESIGNATION BREAK FATAL ;IF ICB POOL INTO APR1, HANG IT UP .IFTF 5$: ;REFERENCE LABEL .IFT MOV #77406,KDSDR0-KINAR0(R5) ;SET D SPACE 4K RW MOV R2,KDSAR0-KINAR0(R5) ;SET D SPACE APR OFFSET ADD #200,R2 ;ADVANCE D SPACE APR OFFSET BY 4K MOV #77402,KINDR0-KINAR0(R5) ;SET I SPACE 4K RO .IFF MOV #77406,KINDR0-KINAR0(R5) ;SET I SPACE 4K RW .IFTF MOV R1,(R5)+ ;SET I SPACE APR OFFSET ADD #200,R1 ;ADVANCE I SPACE OFFSET CMP R5,#KINAR7 ;DONE YET? BLOS 5$ ;IF LOS NO MOV #177600,KISAR7 ;SET UP I/O PAGE MAPPING .IFT CLR (R5) ;CLEAR D SPACE APR0 OFFSET .ENDC .IF DF K$$DAS!M$$EXT!S$$LIB MOV #S3$BTS,SR3 ;SET UP SR3 .ENDC INC SR0 ;ENABLE MAPPING .ENDC ; ; IN A D-SPACE SYSTEM SET UP SPECIAL WORDS IN D-SPACE THAT CAN'T BE ; LINKED AT TASK BUILD TIME. ; $INITM:: ;REFERENCE LABEL .IF DF P$$OOL MOV $PLPAR,R0 ;LOCATE PCB OF SECONDARY POOL PARTITION BNE 502$ ;IF NE, THERE IS ONE MOV #MESS23,R4 ;SPECIFIY MESSAGE TO TYPE ON CONSOL CALL $FATAL ;PREFACE WITH FATAL DESIGNATION BREAK FATAL ;VMR HAS NOT SET UP SECONDARY POOL PAR 502$: ;REF LABEL .ENDC .IF DF D$$PAR TST $DRAPR ;IS THE DIRECTIVE PARTITION FIXED? BNE 505$ ;IF NE YES MOV #MESS0,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLE CALL $FATAL ;PREFACE WITH FATAL DESIGNATION BREAK FATAL ;DIRECTIVE PARTITION NOT FIXED IN MEM 505$: ;REFERENCE SYMBOL .ENDC ; ; INITIALIZE THE POOL MONITOR CONTROL STRUCTURE. ; .IF DF P$$CTL MOV $CRAVL,R0 ;GET POINTER TO SECOND FREE POOL BLOCK CLR R1 ;INITIALIZE SIZE COUNTER 507$: ADD 2(R0),R1 ;ADD LENGTH OF FREE POOL BLOCK MOV (R0),R0 ;POINT TO NEXT FREE POOL BLOCK IN LIST BNE 507$ ;IF NE THERE IS ONE MOV R1,$PRISZ ;STORE IT AWAY FOR THE POOL MONITOR CLR $POLST ;INITIALIZE EXEC/POOL TASK FLAGS .ENDC .IF DF K$$DAS MOV #DTBL,R0 ;SET UP TABLE START ADDRESS 6$: MOV (R0)+,R1 ;GET ADDRESS FOR NEXT ENTRY BEQ 7$ ;IF EQ END OF TABLE MOV (R0)+,(R1) ;STUFF VALUE AT ADDRESS BR 6$ ;GO BACK FOR MORE .ENDC ; ; HAS VMR SET UP THE PER CPU PARTITIONS? ; 7$: MOV @#46,$TEMP0 ;PUT CSR ADDR WHERE WE CAN GET IT LATER MOV @#50,$TEMP1 ;AND THE VIRTUAL UNIT/PARTITION FLAG ;DC410 ;**-1 .IF DF M$$PRO .IF GT M$$PRO-1 TST $CPPAR ;HAS VMR SET UP CPU PARTITION BNE 8$ ;IF NE YES MOV #MESS2,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL CALL $FATAL ;PREFACE WITH FATAL DESIGNATION BREAK FATAL ;CPU PARTITIONS NOT SET UP 8$: ;REFERENCE LABEL .ENDC ; ; IF THIS IS A I+D SPACE SYSTEM, WE MUST TRANSFER THE $SYSIZ INFORMATION ; FROM THE AREA IN LOW MEMORY WHERE WE HAVE SAVED IT TO SYSCM, MAPPED ; IN DATA SPACE. ; .IFTF .IF DF K$$DAS MOV #$SYALT+2,R0 ;SET FROM ADDRESS MOV #$SYSIZ+2,R1 ;SET TO ADDRESS MOV (R0)+,(R1)+ ;MOVE ALL WORDS MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ .IF DF E$$LBN ;DC430 MOV (R0)+,(R1)+ ; COPY THE HIGH ORDER LBN OF SYS IMAGE ;DC430 .ENDC ;DF,E$$LBN ;DC430 ;DC430 .ENDC .IFT MOV #TYPMSG,R5 ;SET RETURN ADDRESS JMP $MAPCP ;SET UP MAPPING FOR KDSAR0 AND UBMAP .IFF .IF DF M$$EXT MOV #$DIRXT,-(SP) ;SETUP EXIT FROM $SGFIN CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS MOV #UBMPR,R0 ;POINT TO FIRST UNIBUS MAPPING REG BIC #HF.UBM,$HFMSK ;ASSUME NO UMRS TST (R0) ;UMRS PRESENT? BCS INTRO ;IF CS NO UMRS BIS #HF.UBM,$HFMSK ;INDICATE THAT UMRS ARE PRESENT .IF DF K$$DAS CLR (R0)+ ;CLEAR FIRST UMR REGISTER PAIR CLR (R0)+ ; MOV $SCMOF,R3 ;PICKUP OFFSET TO DATA SPACE CLR R2 ;SET FOR CONVERSION ASHC #6,R2 ;CONVERT TO DOUBLE WORD BYTE OFFSET MOV #4,R1 ;SET COUNT OF UMRS TO LOAD 11$: MOV R3,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS MOV R2,(R0)+ ;LOAD HIGH 6 BITS OF ADDRESS ADD #20000,R3 ;BUMP ADDRESS BY 4K WORDS ADC R2 ;... SOB R1,11$ ;LOOP BR INTRO ; .IFF CLR R1 ;SET INITIAL ADDRESS TO ZERO MOV #5.,R2 ;SET NUMBER OF REGISTER PAIRS TO LOAD 11$: MOV R1,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS CLR (R0)+ ;CLEAR HIGH 6 BITS OF ADDRESS ADD #20000,R1 ;ADVANCE 8K BYTES SOB R2,11$ ;LOOP BR INTRO ; .ENDC .ENDC .ENDC TYPMSG: MOV #$DIRXT,-(SP) ;SET UP EXIT FROM $SGFIN CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS INTRO: MOV #$SYTYP,R0 ;POINT TO SYSTEM TYPE MOV #SYSMG+4,R1 ;POINT INTO IDENTIFICATION MESSAGE MOV (R0)+,(R1)+ ;MOVE INTO MESSAGE MOV (R0)+,(R1)+ ;... MOV (R0)+,(R1)+ ;... MOV (R0)+,(R1)+ ;... MOV (R0)+,(R1)+ ;... MOV (R0)+,(R1)+ ;... MOV #$VERSN,R0 ;POINT TO SYSTEM VERSION NUMBER MOV #SYSVR,R1 ;POINT INTO IDENTIFICATION MESSAGE MOV (R0)+,(R1)+ ;MOVE INTO MESSAGE MOV (R0)+,(R1)+ ;... MOV #$SYSID,R0 ;POINT TO SYSTEM IDENTIFICATION MOV #SYSID,R1 ;POINT TO IDENTIFICATION MESSAGE MOV (R0)+,(R1)+ ;MOVE SYSTEM IDENTIFICATION INTO MESSAGE MOV (R0)+,(R1)+ ; JSR R5,OPMSG ;TELL EVERYBODY WE'RE ON THE AIR .WORD SYSMG ; MOV #140000,R0 ;SET INITIAL MEMORY ADDRESS CLR R1 ;ZERO NUMBER OF 32W BLOCKS IN SYSTEM MOV #KISAR6,R2 ;POINT TO APR6 MOV #10000,R3 ;ASSUME UPPER LIMIT OF 128KW MOV R3,(R2) ;POINT TO 128KW MOV (R1),-(SP) ;SAVE CONTENTS OF LOCATION 0 MOV (R0),R5 ;SAVE CONTENTS OF LOCATION 128K MOV SP,(R1) ;MOVE NON-ZERO VALUE INTO LOCATION 0 CLR (R0) ;ATTEMPT TO ACCESS WORD AT 128K TST (R1) ;ADDRESS WRAP-AROUND AT LOCATION 0? BEQ 1$ ;IF EQ YES, THIS IS A 128KW SYSTEM MOV #170000,R3 ;NO, UPPER LIMIT CAN BE UP TO 2MW 1$: MOV R5,(R0) ;RESTORE LOCATION 128K MOV (SP)+,(R1) ;RESTORE LOCATION 0 CLR (R2) ;SET ZERO RELOCATION BIAS 2$: TST (R0) ;DOES THIS 1K BLOCK EXIST? BCS 14$ ;IF CS NO, NO MEMORY LEFT ADD #40,R1 ;UPDATE NUMBER OF 32W BLOCKS BY 1K MOV R1,(R2) ;POINT TO NEXT 1K BLOCK OF MEMORY CMP (R2),R3 ;UPPER LIMIT REACHED? BLO 2$ ;IF LO NO 14$: MOV R1,$SYSIZ ;SET SIZE OF MEMORY IN 32W BLOCKS ; ; INITIALIZE THE FEATURE MASK BITS ; ; HF.EIS - SYSTEM HAS EIS HARDWARE ; HF.FPP - SYSTEM HAS FLOATING POINT HARDWARE ; HF.CIS - SYSTEM HAS CIS HARDWARE (DONE BY SAV.TSK) ; HF.SWR - SYSTEM HAS HARDWARE SWITCH REGISTER PRESENT ; BIS #HF.SWR,$HFMSK ; ASSUME SWITCH REGISTER PRESENT MOV @#4,-(SP) ; SAVE TRAP VECTOR 04 MOV #TRP10,@#4 ; POINT TRAP VECTOR 04 AT ROUTINE TO SET CARRY TST SWR ; TEST SWR - BUS TIMES OUT IF NOT PRESENT MOV (SP)+,@#4 ; RESTORE TRAP VECTOR 04, LEAVE CARRY UNAFFECTED BCC 150$ ; READ OK, IT WAS THERE BIC #HF.SWR,$HFMSK ; NOT THERE, $SGFIN SET CARRY BIT CLR $SWR ; BE NICE, INIT CLEAR SW (SYSCM) SWR 150$: BIC #HF.CIS,$HFMSK ;SAV.TSK WILL FIGURE THIS ONE OUT BIS #HF.EIS,$HFMSK ;EVERY M-PLUS SYSTEM HAS EIS MOV @#10,-(SP) ;SAVE ILLEGAL INSTRUCTION VECTOR MOV #TRP10,@#10 ;SET VECTOR BIS #HF.FPP,$HFMSK ;ASSUME NO FLOATING POINT CLC ;CLEAR CARRY SETI ;ISSUE A FLOATING POINT INSTRUCTION BCS 15$ ;IF CS FPP NOT PRESENT BIC #HF.FPP,$HFMSK ;SHOW FPP PRESENT 15$: ;REFERENCE LABEL .IF DF P$$3XX CLR $HFMSK+2 ;ASSUME NOT BRIDGE, NOT PRO-3XX MFPT ;GET CPU TYPE BCS 152$ ;IF CS NOT A BRIDGE OR A PRO CMPB #3,R0 ;IS THIS A F11 BASED SYSTEM? BEQ 151$ ;IF EQ YES, MAY BE PRO-3XX CMPB #5,R0 ;IS THIS A J11 BASED SYSTEM? BNE 152$ ;IF NE NO, NOT A PRO-3XX 151$: TST @#177750 ;LOOK AT THE MAINTENANCE REGISTER BCS 152$ ;IF CS NOT THERE, CAN'T BE PRO-3XX BNE 152$ ;IF NE ISN'T PRO-3XX EITHER BIS #H2.PRO,$HFMSK+2 ;SET PRO BIT IN HARDWARE FEATURE MASK BR 153$ ;BACK TO COMMON CODE 152$: TST @#176010 ;IS THIS A BRIDGE? BCS 153$ ;IF CS NO BIS #H2.BRG,$HFMSK+2 ;INDICATE BRIDGE SYSTEM .ENDC ; DF P$$3XX 153$: MOV (SP)+,@#10 ;RESTORE ILLEGAL INSTRUCTION VECTOR .IF DF M$$PRO BIC #MP.STP,@$MPSWT ;CLEAR STOP BIT MOV $CPBIT,$URMST ;SET ONLINE PROCESSOR MASK MOV $CPBIT,$IIMSK ;SET IIST CONNECTION MASK MOV $CPBIT,$CKURM ;WE WILL HANDLE THE CLOCK LOCK$ $EXECL,WAIT ;GRAB EXECUTIVE LOCK .ENDC ; ; SEARCH FOR SYSTEM DEVICE USING CSR ADDRESS AND PHYSICAL UNIT NUMBER ; AS KEYS. WHEN IT IS FOUND, SET UNIT AND CONTROLLER ONLINE, AND SET ; UP $SYSIZ VECTOR WITH THE CORRECT LOGICAL UNIT NUMBER. ; CLR .SY0+2 ;CLEAR FLAG THAT WE FOUND SYSTEM DISK MOV #$DEVHD,R5 ;GET ADDRESS OF FIRST DCB ADDRESS 20$: MOV (R5),R5 ;GET ADDRESS OF NEXT DCB BNE 25$ ;IF NE YES -- KEEP TRYING ;DC410 MOV $TEMP2,R4 ; GET POSSIBLE UCB ADDRESS ;DC410 BEQ 22$ ; NONE PRESENT ;DC410 ;DC410 MOV (R4),R5 ; GET THE DCB ADDRESS ;DC410 MOV U.SCB(R4),R3 ; AND THE SCB ADDRESS ;DC410 MOV $TEMP0,@S.KRB(R3) ; STUFF A NEW CSR ;DC410 MOVB $TEMP3,-(SP) ; SAVE THE LOGICAL UNIT NUMBER ;DC410 CLR -(SP) ; AND AN EXTRA WORD ;DC410 BR 45$ ; AND CONTINUE ;DC410 ;DC410 22$: MOV #MESS3,R4 ;SPECIFY MESSAGE TO BE TYPED ON CONSOL ;DC410 CALL $FATAL ;PREFACE WITH "FATAL ERROR -- " ;DC410 MOV $SYSIZ+6,R0 ;PLACE DEVICE NAME IN R0 ;DC410 MOV $TEMP1,R1 ;POINT TO FLAGS WORD ;DC410 MOV $TEMP0,R2 ;PLACE CSR IN R2 ;DC410 ;**-8 .IF DF M$$PRO MOVB $PROCN,R3 ;PLACE PROCESSOR NUMBER IN R3 .ENDC BREAK FATAL ;COULD NOT FIND LOAD DEVICE IN THIS SYS. 25$: MOV D.UCB(R5),R4 ;POINT TO FIRST UCB BIT #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE? BNE 20$ ;IF NE YES MOVB D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER MOVB D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN SUB D.UNIT(R5),(SP) ; INCB (SP) ; 40$: MOV U.SCB(R4),R3 ;GET SCB ADDRESS MOV S.KRB(R3),R0 ;GET KRB ADDRESS BEQ 50$ ;IF EQ NO KRB ADDRESS -- NOT SYSTEM DEV. CMP $SYSIZ+6,D.NAM(R5) ;DO DEVICE NAMES MATCH? BNE 50$ ;IF NE NO CMPB $SYSIZ+2,U.UNIT(R4) ;DO PHYSICAL UNIT NUMBERS MATCH? BNE 50$ ;IF NE NO CMP $TEMP0,(R0) ;DO CSR ADDRESSES MATCH? .IF DF M$$PRO ;**-3 BNE 43$ ;IF NE ADDRESSES DON'T MATCH BIT @$CPURM,K.URM(R0) ;IS IT ON THIS PROCESSOR BNE 45$ ;IF NE YES -- USE THIS ONE 43$: ;DC4 .IFF ;**-1 BEQ 45$ ;IF EQ YES -- USE THIS ONE .ENDC .IF DF M$$ACD ;DC483 ;DC483 ; ; THE S.KRB KRB IS NOT THE ONE WE WANT. IF THE DEVICE IS DUAL-ACCESS, ; THEN WE WILL SEE IF THE OTHER PORT IS THE ONE TO WHICH WE ARE REALLY ; CONNECTED. ; MOV #S2.MAD!S2.LDS,R1 ;GET STATUS BITS ;DC483 BIC S.ST2(R3),R1 ;ARE THEY ALL SET? (IS THIS DUAL-ACCESS) ;DC483 BEQ 435$ ; IF EQ, YES, DUAL ACCESS ;DC483 ;DC483 TST $TEMP2 ; ALREADY HAVE A TARGET DEFINED ;DC483 BNE 50$ ; YUP .. ;DC483 ;DC483 .IFTF ;DF,M$$ACD ;DC483 ;DC483 MOV R4,$TEMP2 ; SAVE ADDRESS OF UCB ;DC483 MOVB 2(SP),$TEMP3 ; SAVE THE LOGICAL UNIT ;DC483 ;DC483 .IFT ;DF,M$$ACD ;DC483 ;DC483 BR 50$ ; AND CONTINUE THE SCAN ;DC483 ; ;**-4 ; UNIT IS MULTI-ACCESS, AND WE CAN CONTROL THE VALUE OF S.KRB. CAN WE ; FIND THE PORT THRU WHICH WE ARE CONNECTED. ; 435$: ;DC483 MOV S.KTB(R3),R0 ;ASSUME THIS IS THE KRB ;**-1 CMP R0,S.KRB(R3) ;IS THIS THE ONE WE ALREADY CHECKED? BNE 44$ ;IF NE NO -- USE THIS ONE MOV S.KTB+2(R3),R0 ;USE THE OTHER ONE 44$: CMP $TEMP0,(R0) ;IS THE CSR THE SAME? BEQ 445$ ;IF NE NO -- NO WAY OUT THIS TIME ;DC483 ;DC483 .IFTF ;DF,M$$ACD ;DC483 ;DC483 ;DC483 50$: INCB 2(SP) ;UPDATE LOGICAL UNIT NUMBER ;DC483 ADD D.UCBL(R5),R4 ;CALCULATE ADDRESS OF NEXT UCB ;DC483 DECB (SP) ;ANY MORE UCB'S TO SCAN? ;DC483 BNE 40$ ;IF NE YES ;DC483 CMP (SP)+,(SP)+ ; CLEAN THE STACK ;DC483 BR 20$ ; AND CONTINUE THE LOOP ;DC483 ;DC483 445$: ;DC483 .IF DF M$$PRO ;**-6 BIT @$CPURM,K.URM(R0) ;IS IT ATTACHED TO THIS CPU BEQ 50$ ;IF EQ NO .ENDC .IFT ;DF,M$$ACD ;DC483 ;DC483 MOV R0,S.KRB(R3) ;SET NEW KRB POINTER ;DC483 ;DC483 .ENDC ;DF,M$$ACD ;DC483 ;**-4 45$: BISB #US.VV,U.STS(R4) ;SET VOLUME VALID BIT IN SYS DEV UCB MOV R4,$TEMP2 ; SAVE UCB ADDRESS OF PHYSICAL DEVICE ;DC410 TST $TEMP1 ;IS THIS A VIRTUAL DISK/OR PARTITION ;DC410 BPL 49$ ;IF PL, NOPE, SKIP VIRTUAL/PART INFORMATION ;DC410 ;DC410 .IF DF V$$DSK ; BOOTABLE VIRTUAL DISK AND PARTITION SUPPORT ;DC410 ;DC410 CLR @#KISAR6 ; MAP APR6 TO LOW MEMORY FOR LBN PAIRS ;DC410 MOV #140000,R2 ; POINT TO PHYSICAL ZERO ;DC410 BIS (R2),R2 ; AND MAP TO THE TOP OF THE PAIRS ;DC410 BIC #100000,$TEMP1 ; REMOVE VIRTUAL FLAG ;DC410 ;DC410 MOVB $TEMP1+1,R1 ; GET THE SUB-UNIT SPECIFIER ;DC410 BEQ 47$ ; IF EQ, ONLY VIRTUAL DEVICES ;DC410 ;+ ;DC410 ; This section will process a partitioned drive, and allow a disk ;DC410 ; which has been partitioned to boot normally. The only drives which ;DC410 ; are supported are MSCP class device, and those device will reserve ;DC410 ; the high byte of U.CW2 for the partition designation. All devices ;DC410 ; which can be partitioned will have S2.PRT set in the SCB, to insure ;DC410 ; that we are not going beyond the ability of the driver. ;DC410 ;- ;DC410 BIT #S2.PRT,S.ST2(R3) ; IS THIS DEVICE PARTITIONABLE? ;DC410 BNE 46$ ; YES, WE CAN PROCEED ;DC410 ;DC410 MOV #MESS27,R4 ; ERROR MESSAGE ;DC410 455$: CALL $FATAL ; SHOW THE ERROR ;DC410 BREAK FATAL ; AND WE ARE DONE ;DC410 ;DC410 46$: BIS #UU.PRT,U.UTIL(R4) ; SHOW DRIVE W/ ACTIVE PARTITION ;DC410 DECB R1 ; NORMALIZE THE PARTITION INDEX ;DC410 MOVB R1,U.PRM(R4) ; AND SET UP THE PARTITION INDEX ;DC410 TSTB -1(R2) ; USING 32-BITS ;DC410 BEQ 465$ ; IF EQ, ONLY 24-BITS ;DC410 .IF DF E$$LBN ; 32-BIT LBN SUPPORT ;DC410 BIS #DV.32B,U.CW1(R4) ; SHOW WE HAVE A 32-BIT SIZED DEVICE ;DC410 .IFF ;DF,E$$LBN ;DC410 463$: MOV #MESS29,R4 ; SET THE ERROR MESSAGE ;DC410 BR 455$ ; and report the error ;DC410 .ENDC ;DF,E$$LBN ;DC410 465$: MOV -(R2),U.CW2(R4) ; LOAD THE DEVICE SIZE ;DC410 MOV -(R2),U.CW3(R4) ; AND THE LOW ORDER SIZE ;DC410 MOV -(R2),U.PART(R4) ; LOAD PARTITION HIGH ORDER BASE LBN ;DC410 MOV -(R2),U.PART+2(R4) ; AND LOW ORDER BASE LBN (NOTE: 32BITS) ;DC410 ;DC410 47$: MOV R2,R3 ;COPY LBN STACK POINTER TO R3 ;DC410 MOV #.VF0,R5 ; POINT TO FIRST VF: UCB ;DC410 MOVB $VFDCB+D.UNIT+1,(SP) ; SAVE HIGHEST UNIT ;DC410 INC (SP) ; AND ACCOUNT FOR UNIT 0 ;DC410 ;DC410 475$: MOV -(R3),R0 ; GET HIGH ORDER DEVICE SIZE ;DC410 MOV -(R3),R1 ; AND LOW ORDER DEVICE SIZE ;DC410 BIS R0,(R3) ; ARE WE THROUGH? ;DC410 BEQ 49$ ; IF EQ, YES, CONTINUE ... ;DC410 ;DC410 TST (SP) ; ENOUGH UNITS AVIALABLE? ;DC410 BNE 48$ ; IF NE, YES, CONTINUE ;DC410 ;DC410 476$: MOV #MESS28,R4 ; DEVICE NESTING TOO DEEP ;DC410 ;DC410 .IFF ;DF,V$$DSK ;DC410 ;DC410 MOV #MESS29,R4 ; NO VIRTUAL/PARTITION DISK SUPPORT ;DC410 ;DC410 .IFTF ;DF,V$$DSK ;DC410 ;DC410 CALL $FATAL ; REPORT THE ERROR ;DC410 BREAK FATAL ; ALL DONE ;DC410 ;DC410 .IFT ;DF,V$$DSK ;DC410 ;DC410 48$: MOV R0,U.CW2(R5) ; LOAD IN DEVICE SIZE ;DC410 MOV R1,U.CW3(R5) ; BOTH HALVES ... ;DC410 ;DC410 MOV #FX.SIZ,R1 ; SIZE OF POOL NEEDED ... ;DC410 ;DC410 CLRB R0 ; CLEAR THE LOW ORDER PART ;DC410 BISB -1(R3),R0 ; IS EITHER PART 32-BITS ;DC410 BEQ 485$ ; IF EQ, NOPE, JUST 24-BITS ;DC410 .IF DF E$$LBN ;DC410 BIS #DV.32B,U.CW1(R5) ; SHOW 32-BIT DEVICE SUPPORT ;DC410 TST (R1)+ ; ADD AN ADDITIONAL WORD ;DC410 .IFF ;DF,E$$LBN ;DC410 BR 463$ ; 32-BIT DEVICES NOT SUPPORTED ;DC410 .IFTF ;DF,E$$LBN ;DC410 485$: ; REFERENCE LABEL ;DC410 CALL $ALOCB ; AND ALLOCATE IT ... ;DC410 BCS 476$ ; CAN'T ALLOCATE POOL ;DC410 ;DC410 .IFT ;DF,E$$LBN ;DC410 BIT #DV.32B,U.CW1(R5) ; 32-BIT LOGIC IN USE ;DC410 BEQ 487$ ; IF EQ, NOPE ;DC410 MOV -(R3),(R0)+ ; SAVE THE HIGH ORDER LBN SETUP ;DC410 487$: ; REFERENCE LABEL ;DC410 .IFTF ;DF,E$$LBN ;DC410 MOV R0,U.FCBX(R5) ; INITIALIZE THE FCBX ;DC410 MOV R4,(R0)+ ; TARGET UCB ADDRESS ;DC410 CLR (R0)+ ; NO WINDOW PRESENT ;DC410 .IFT ;DF,E$$LBN ;DC410 BIT #DV.32B,U.CW1(R5) ; USING 32-BIT LOGIC ;DC410 BEQ 488$ ; IF EQ, NOPE, LOAD IN THE HIGH BITS ;DC410 CLR (R3)+ ; INSURE WE LOAD A ZERO FOR HIGH LBN/FLAG ;DC410 488$: .ENDC ;DF,E$$LBN ;DC410 MOV -(R3),(R0)+ ; HIGH ORDER TARGET LBN ;DC410 MOV -(R3),(R0)+ ; AND LOW ORDER TARGET LBN ;DC410 MOV -(R3),(R0)+ ; NOW FOR THE FILE SEQUENCE NUMBER ;DC410 MOV -(R3),(R0)+ ; AND FILE NUMBER ;DC410 MOVB U.UNIT(R5),2(SP) ; UPDATE SYSTEM DEVICE LOGICAL UNIT ;DC410 MOV #"VF,$SYSIZ+6 ; AND SHOW VF: AS SYSTEM DISK ;DC410 MOVB U.CTL(R4),U.CTL(R5) ; PROPOGATE NPR STATUS ;DC410 BICB #UC.QUE,U.CTL(R5) ; BUT DON'T CALL BEFORE QUEUEING ;DC410 MOV R5,R4 ; COPY PREVIOUS VF TO LINK CORRECTLY ;DC410 ADD $VFDCB+D.UCBL,R5 ; ADJUST TO THE NEXT UNIT ;DC410 DEC (SP) ; DROP THE COUNT AVAILABLE ;DC410 BR 475$ ; AND PROCESS ANOTHER UNIT ;DC410 ;DC410 .ENDC ;DF,V$$DSK ;DC410 ;DC410 49$: MOV R4,.SY0+2 ;REDIRECT SYSTEM DEVICE (SY0:) ;DC410 MOV R4,.LB0+2 ;REDIRECT SYSTEM DEVICE (LB0:) ;DC410 ;**-2 .IF NDF R$$PRO MOV R4,.SP0+2 ;REDIRECT SPOOL DEVICE (SP0:) ;DC410 ;**-1 .ENDC ; NDF R$$PRO TST (SP)+ ; CLEAN THE STACK (REMAINING UNITS) ;DC410 MOVB (SP)+,$SYSIZ+2 ;SET LOGICAL UNIT NUMBER OF LOAD DEV. ;DC410 MOV $TEMP2,R4 ;RETREIVE THE UCB W/ THE CONTROLLER ;DC410 ; ;**-9 ; SCAN CTB LIST TO FIND THE CORRECT CTB FOR THE LOAD DEVICE ; ; A CTB MUST BE FOUND THAT POINTS TO THE CORRECT KRB OR THIS ; CODE WILL NOT EXECUTE PROPERLY. ; 52$: MOV #$CTLST,R5 ;GET START OF CTB LIST 54$: MOV (R5),R5 ;GET NEXT CTB ;THE CTB CONTAINING OUR KRB M U S T EXIST MOV L.DCB(R5),R2 ;GET DCB POINTER FROM CTB BITB #LS.CIN,L.STS(R5) ;IS IT A COMMON INTERRUPT CONTROLLER BNE 55$ ;IF NE YES -- SEARCH THE TABLE FOR DCB CMP R2,U.DCB(R4) ;IS THIS THE CORRECT CTB BNE 54$ ;IF NE NO BR 65$ ;YES -- CREATE VECTOR FOR THIS KRB/CTB ; ; CONTROLLER IS A COMMON INTERRUPT CONTROLLER ; 55$: TST (R2)+ ;SKIP COMMON INTERRUPT ADDRESS 60$: TST (R2) ;IS THIS THE END OF THE TABLE BEQ 54$ ;IF EQ YES CMP (R2)+,U.DCB(R4) ;DOES THE DCB MATCH OUR DCB? BNE 60$ ;IF NE NO ; ; CREATE VECTOR FOR THE SYSTEM LOAD DEVICE ; 65$: MOV $TEMP2,R3 ;GET UCB ADDRESS OF SYSTEM PHYSICAL DISK ;DC410 MOV U.SCB(R3),R4 ;GET SCB ADDRESS ;**-1 MOV S.KRB(R4),R4 ;GET KRB ADDRESS INTO R4 BIT #KS.SLO,K.STS(R4) ;IS THIS A SLOW CONTROLLER? BEQ 70$ ;IF EQ NO MOV #PMODE,PS ;YES, ALLOW DISK INTERRUPTS 70$: CALL ONLIN ;CREATE VECTOR AND PUT DEVICE ONLINE MOV #PMODE+PR7,PS ;LOCKOUT INTERRUPTS ;DC430 .IF DF,V$$DSK ; VIRTUAL DISK SUPPORT ;DC430 ;DC430 MOV .SY0+2,R5 ; GET SYSTEM DISK UCB ADDRESS ;DC430 ;DC430 705$: CMP R5,$TEMP2 ; IS THIS THE "PHYSICAL DISK"? ;DC430 BEQ 71$ ; IF EQ, YES, ALL DONE ... ;DC430 ;DC430 CALL ONLINU ; BRING THE UNIT ONLINE ;DC430 BISB #US.VV,U.STS(R5) ; AND SHOW VOLUME VALID ;DC430 MOV @U.FCBX(R5),R5 ; GET NEXT DEVICE IN THE LIST ;DC430 BR 705$ ; AND HANDLE ANOTHER UNIT ;DC430 ;DC430 71$: ; REFERENCE LABEL ;DC430 .ENDC ;DF,V$$DSK ;DC430 ; ; SET TERMINAL ONLINE ; .IF DF M$$PRO MOVB $PROC2,R0 ;GET PROCESSOR ID AS WORD INDEX MOV $YLCTB(R0),R4 ;GET KRB ADDRESS OF CONSOL TERMINAL MOV K.OWN(R4),R5 ;GET UCB ADDRESS OF CONSOL TERMINAL MOV R5,.CO0+2 ;REDIRECT CO: MOV R5,.CL0+2 ;REDIRECT CL: .IFF MOV #.TT0,R5 ;GET TT0 UCB ADDRESS MOV #$YLA,R4 ;GET FIRST DL11 KRB ADDRESS .ENDC BIC #U2.LOG,U.CW2(R5) ;SHOW CO: LOGGED IN BIS #U2.PRV,U.CW2(R5) ;MAKE CO: PRIVILEGED MOV #$YLCTB-L.KRB,R5 ;GENERATE YL CTB ADDRESS ; ; CREATE VECTOR AND PLACE TERMINAL ONLINE ; MOV K.OWN(R4),R3 ;GET UCB ADDRESS CALL ONLIN ; ; SET UP DUMP DEVICE KRB ADDRESS FOR CRASH ; .IF DF C$$CDA BIT #F4.LCD,$FMASK+6 ;LOADABLE CRASH DRIVER SUPPORT ? BNE 77$ ;IF EQ, NO - DRIVER IS RESIDENT ;DC430 ;DC430 .IF NE C$$CDA ;DC430 ;**-4 MOV #$DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE HEAD 72$: MOV (R2),R2 ;GET ADDRESS OF NEXT DCB BNE 73$ ;IF NO, GOT ONE MOV #MESS25,R4 CALL WARN ;SEND MESSAGE TO CONSOL CLR -(SP) ;PICK UP TWO BYTE, NON-WORD ALIGNED MOVB $CRDEV,(SP) ;CRASH DEVICE TYPE MOVB $CRDEV+1,1(SP) ;AND PLACE ON STACK MOV (SP)+,R0 ;AND THEN INTO R0 FOR PUBLIC VIEWING MOV $CRSUN,R1 ;GET LOGICAL UNIT NUMBER CLR R2 ;CLEAR POTENTIAL CSR ADDRESS BREAK MOV R1,$CRSUN ;GET WHAT IS NOW CONSIDERED AS A ;PHYSICAL UNIT NUMBER MOV R2,$CRCSR ;GET THE CSR ADDRESS WHICH USER TYPED MOV #3,R2 ; set up a count of digits MOV #$CRUNT+3,R0 ; point to the storage area 725$: MOVB R1,-(R0) ; store the physical unit number BICB #^C<7>,(R0) ; isolate the unit number BISB #'0,(R0) ; and create ASCII text ASH #-3,R1 ; shift for the next digit SOB R2,725$ ; loop through three digits. BR 77$ ;EXIT CRASH PROCESSING 73$: CMPB D.NAM(R2),$CRDEV ;IS THIS THE DCB FOR THE CRASH DUMP DEVICE? BNE 72$ ;NO IF NE, LOOK AT NEXT DCB CMPB D.NAM+1(R2),$CRDEV+1 ;MAYBE, CHECK NEXT CHARACTER BNE 72$ ;NO IF NE, LOOK AT NEXT DCB MOV $CRSUN,R1 ;GET CRASH DEVICE LOGICAL UNIT NUMBER MOVB D.UNIT(R2),R0 ;GET LOWEST UNIT FOR THIS DCB CMP R1,R0 ;IS CRASH DEVICE HANDLED BY THIS DCB? BLO 72$ ;NO IF LO CMPB R1,D.UNIT+1(R2) ;MAYBE, CHECK HIGHEST UNIT FOR THIS DCB BHI 72$ ;NO IF HI SUB R0,R1 ;CALCULATE NUMBER OF PROPER UCB MOV D.UCBL(R2),R0 ;GET UCB LENGTH MOV D.UCB(R2),R2 ;GET FIRST UCB ADDRESS 74$: DEC R1 ;POINTING TO PROPER UCB YET? BLT 76$ ;YES IF LT ADD R0,R2 ;POINT TO NEXT UCB BR 74$ ;GO AGAIN 76$: MOVB U.UNIT(R2),$CRSUN ;SAVE PHYSICAL UNIT NUMBER MOV U.SCB(R2),R2 ;GET SCB ADDRESS MOV S.KRB(R2),$CRKRB ;SAVE KRB ADDRESS .ENDC ; NE C$$CDA ;DC403 77$: .ENDC ; DF C$$CDA ; ; CREATE VECTOR FOR IIST KRB ; .IF DF M$$PRO MOVB $PROC2,R0 MOV $IICTB(R0),R4 BIT #KS.OFL,K.STS(R4) ;DO WE HAVE ONE OF THESE? BNE 80$ ;IF NE NO MOV #$IICTB-L.KRB,R5 ;GENERATE IIST KRB ADDRESS CLR R3 ;SHOW NO UCB ADDRESS CALL ONLIN .ENDC ; ; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLE ; 80$: ;UNCONDITIONAL REFERENCE .IF DF P$$RTY MOV #$PARTB,R0 ;GET ADDRESS OF PARITY CSR TABLE MOV R0,R1 ;COPY ADDRESS OF TABLE MOV #1,(R1)+ ;INSERT A ONE IN FIRST TABLE ENTRY MOV #$CSRTB,R4 ;GET ADDRESS OF CSR TABLE 85$: MOVB (R4)+,R3 ;GET NUMBER OF CSR'S TO SET UP BEQ 105$ ;IF EQ DONE CLR R2 ;INITIALIZE CSR ADDRESS BISB (R4)+,R2 ;CALCULATE CSR ADDRESS SWAB R2 ;GET HIGH BYTE OF CSR ADDRESS BISB (R4)+,R2 ;GET LOW BYTE OF CSR ADDRESS 90$: TST (R2) ;CSR PRESENT? BCS 95$ ;IF CS NO MOV R2,(R1)+ ;SAVE CSR ADDRESS BR 100$ ; 95$: MOV R0,(R1)+ ;POINT TO FIRST WORD OF TABLE 100$: ADD #2,R2 ;POINT TO NEXT CSR SOB R3,90$ ;LOOP UNTIL NONE ARE LEFT BR 85$ ;CONTINUE THROUGH THE REST OF THE TABLE 105$: ;REF LABEL .ENDC ; DF P$$RTY .IF DF F$$LPP TST PIRQ ;IS THERE A PIRQ REGISTER? BCS 106$ ;IF CS NO MOV #$FPPRQ,@#240 ;SET UP PIRQ VECTOR MOV #$FPPR8,@#244 ;SET UP FLOATING POINT EXCEPTION VECTOR 106$: ;REF LABEL .ENDC JSR R5,OPMSG ;OUTPUT INITIAL PROMPT MESSAGE .WORD PROMT ; .IF DF P$$3XX BIT #H2.PRO,$HFMSK+2 ;IS THIS A PRO-3XX SYSTEM? BEQ 107$ ;IF EQ NO, SKIP CLOCK CODE BIS #H2.CLK,$HFMSK+2 ;INDICIATE PRO CLOCK PRESENT MOV #173030,R0 ;GET XT CLOCK CSR3 ADDRESS MOV R0,$CKCSR ;SET CSR OF CLOCK MOV R0,$CKCSA ;SET CSR OF CLOCK TO TICKLE BICB #177,-4(R0) ;CLEAR ANY SELECTED FUNCTIONS BISB #52,-4(R0) ;SET DEFAULT DIVIDER CONTROL MOV #64.,$TKPS ;SET TICK RATE FOR THE EXEC CLR $CKLDC ;NO LOAD COUNT CLR $CKCNT ;NO PLACE TO COUNT MOV #$CKINT,@#230 ;INITIALIZE CLOCK VECTOR MOV #340,@#232 ; ... MOV #106,-2(R0) ;ENABLE INTERRUPTS, BINARY DATA, 24HR MOV #57,@#173202 ;ENABLE INTERRUPT CONTROLLER BIS #H2.ITF,$HFMSK+2 ;SET THE TIME BAD DUE TO BATTERY FAILURE? BR 130$ ;SKIP NORMAL Q/U CLOCK CODE 107$: ;REFERENCE LABEL .ENDC ; DF P$$3XX MOV $CKCSR,R0 ;GET ADDRESS OF CLOCK CSR TST (R0) ;IS THE GENERATED CLOCK AVAILABLE? BCC 110$ ;IF CC YES MOV #172540,R0 ;GET ADDRESS OF KW11-P CSR MOV R0,$CKCSR ;SETUP FOR KW11-P MOV #172542,$CKCNT ; MOV #K$$LDC,$CKLDC ;SET COUNT REGISTER LOAD COUNT MOV #K$$TPS,$TKPS ;SET TICKS PER SECOND TST (R0) ;KW11-P? BCC 110$ ;IF CC YES MOV #177546,R0 ;GET ADDRESS OF KW11-L CSR MOV R0,$CKCSR ;SETUP FOR KW11-L MOV R0,$CKCNT ; CLR $CKLDC ; MOV #H$$RTZ,$TKPS ;SET TICKS PER SECOND TO LINE FREQUENCY 110$: .IF DF E$$NSI MOV #$NS1,100 ;RESET KW11-L VECTOR .IFF ; DF E$$NSI MOV #$NONSI,100 ;RESET KW11-L VECTOR .ENDC ; E$$NSI MOV #$CKINT,104 ;SETUP KW11-P VECTOR CMP #172540,R0 ;KW11-P? BEQ 120$ ;IF EQ YES MOV #$CKINT,100 ;SETUP KW11-L VECTOR .IF DF E$$NSI MOV #$NS1,104 ;RESET KW11-P VECTOR .IFF ; DF E$$NSI MOV #$NONSI,104 ;RESET KW11-P VECTOR .ENDC ; E$$NSI TST (R0) ;FREE RUNNING CLOCK WITH NO CSR? BCC 120$ ;IF CC NO CLR $CKCSR ;CLEAR CSR ADDRESS CLR $CKCNT ;CLEAR COUNT REGISTER BR 130$ ; 120$: MOV $CKCNT,R1 ;GET ADDRESS OF COUNT REGISTER MOV $CKLDC,(R1) ;SETUP CLOCK COUNT REGISTER MOV #K$$IEN,(R0) ;START CLOCK 130$: MOV #PMODE+PR7,PS ;MAKE SURE PS IS SETUP PROPERLY .IF NDF R$$PRO CALL $CPNIT ;INITIALIZE PROCESSOR .IFF CALL $POWER .ENDC ; NDF R$$PRO .IF DF M$$PRO MOVB $NCPU,R4 ;GET NUMBER OF CPUS IN SYSTEM ASL R4 ;FORM WORD INDEX ADD #$K6TAB,R4 ;AND POINT PAST LAST PROCESSOR MTPS #PR7 ;DISABLE INTERRUPTS SINCE LOWCR WILL ;BE UNMAPPED MOV KISAR0,$TEMP0 ;;;SAVE REAL CPU MAPPING 10$: MOV -(R4),KISAR0 ;;;MAP TO A PROCESSOR .IFTF ; DF M$$PRO MOV #SYSMG,R0 ;SET ADDRESS OF BLOCK TO RELEASE MOV #$ICAVL-2,R3 ;POINT TO ICB POOL LISTHEAD ADD (R3),R0 ;ROUND TO NEXT BOUNDARY BIC (R3),R0 ; MOV #&^C3,R1 ;SET LENGTH OF BLOCK TO RELEASE .IFF ; DF M$$PRO CALLR $DEAC1 ;DEALLOCATE INITIALIZATION CODE .IFT ; DF M$$PRO CALL $DEAC1 ;;;DEALLOCATE A COPY CMP #$K6TAB,R4 ;;;FINISHED YET ? BLO 10$ ;;;IF LO NO, GO TO NEXT CPU MOV $TEMP0,KISAR0 ;;;REMAP TO REAL PROCESSOR MTPS #0 ;;;ALLOW INTERRUPTS RETURN ; .ENDC ; DF M$$PRO ; ; ROUTINE TO SET CARRY ON TRAPS THRU 10 FOR FPP DETERMINATION ; TRP10: BIS #1,2(SP) ;SET CARRY IN PSW RTI ; ; ; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINAL ; OPMSG: MOV (R5)+,R1 ;GET ADDRESS OF OUTPUT MESSAGE OPMSG1: ;REFERENCE LABEL 10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUT BEQ 30$ ;IF EQ DONE MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER 20$: TSTB TPS ;PRINTER BUSY? BCS 30$ ;IF CS NO CONSOLE TERMINAL BPL 20$ ;IF PL YES BR 10$ ;GO AGAIN 30$: RTS R5 ; ; ; **-WARN-WRITE "WARNING -- " ON CONSOL AND THEN PRINT MESSAGE. ; ; INPUTS: ; ; R4=MESSAGE ADDRESS. ; ; OUTPUTS: ; ; NONE. ; ; ALL REGISTERS ARE PRESERVED. ; .ENABL LSB .IF NDF R$$PRO WARN: MOV R4,-(SP) ;SAVE MESSAGE SPECIFIED FOR LATER MOV #MESS24,R4 ;PRINT "WARNING --" BR 5$ ;ENTER FATAL ROUTINE .ENDC ; NDF R$$PRO ; ; **-$FATAL-WRITE "FATAL ERROR -- " ON CONSOL AND THEN PRINT MESSAGE. ; ; THIS ROUTINE WILL WRITE "FATAL ERROR -- " ON THE CONSOL AND THEN ; PRINT THE MESSAGE ON THE CONSOL. PRIOR TO THIS, IT WILL PRINT ; OUT A CR, TWO FILLS, AND THEN A LF. ; ; INPUTS: ; ; R4=MESSAGE ADDRESS ; ; OUTPUTS: ; ; NONE. ; ; ALL REGISTERS PRESERVED. ; $FATAL::MOV R4,-(SP) ;SAVE R4 FOR LATER MOV #MESS22,R4 ;SET THE FATAL MESSAGE 5$: CALL WRITLN ;WRITE WITH CR/LF FIRST MOV (SP)+,R4 ;RESTORE R4 WITH MESSAGE ADDRESS ; ; **-WRITE-WRITE A LINE TO CONSOL WITH NO CR/LF FIRST. ; ; INPUTS: ; ; R4=MESSAGE ADDRESS ; ; OUTPUTS: ; ; NONE. ; ; ALL REGISTERS PRESERVED. ; .IF NDF R$$PRO WRITE: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP END MOV R0,-(SP) ;SAVE R0 FOR LATER MOV R1,-(SP) ;SAVE R1 FOR LATER .ENDC ; NDF R$$PRO 10$: MOV R4,R1 ;SET UP FOR OPMSG JSR R5,OPMSG1 ;DO LINE OUTPUT MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0 RETURN ; ; **-WRITLN-WRITE A LINE WITH CR, FILLS, AND A LINE FEED FIRST. ; ; INPUTS: ; ; R4=ADDRESS OF MESSAGE. ; ; OUTPUTS: ; ; NONE. ; ; ALL REGISTERS ARE PRESERVED. ; WRITLN: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP END MOV R0,-(SP) ;SAVE R0 FOR LATER MOV R1,-(SP) ;SAVE R1 FOR LATER JSR R5,OPMSG ;SEND MESSAGE .WORD FILL ;FILLS BR 10$ ;ENTER WRITE, IN PROGRESS .DSABL LSB ; ; **-ONLIN-PUT DEVICE ONLINE AND CREATE VECTOR ; ; THIS ROUTINE WILL CREATE THE VECTORS FOR A DEVICE AND THEN ; PLACE THE DEVICE ONLINE. IT WILL CALL THE DRIVER AT BOTH ; THE KRB STATUS CHANGE ENTRY AND THE UCB STATUS CHANGE ENTRY. ; ; INPUTS: ; ; R3=UCB ADDRESS. ; R4=KRB ADDRESS OF CONTROLLER NEEDING VECTORS. ; R5=CTB ADDRESS FOR THE KRB IN R4. ; ; OUTPUTS: ; ; VECTORS HAVE BEEN CREATED WHEN CONTROL RETURNS TO CALLER. ; THE DEVICE HAS BEEN PLACED ONLINE. ; .ENABL LSB ;DC403 ONLIN: ;REFERENCE LABEL ;**-1 .IF DF R$$CON MOV R3,-(SP) ;SAVE UCB ADDRESS MOV R4,-(SP) ;SAVE KRB ADDRESS MOV R5,-(SP) ;SAVE CTB ADDRESS .IFTF ; DF R$$CON MOV #GETVC,-(SP) ;PREPARE FOR COORTOUTINE CALL 10$: CALL @(SP)+ ;GET NEXT VECTOR ADDRESS BCS 30$ ;IF CS RETURN TO CALLER BEQ 20$ ;IF EQ NO ERRORS .IFT ; DF R$$CON MOV R0,-(SP) ;SAVE IMPORTANT VALUES IN CASE MOV R2,-(SP) ;USER WANTS TO MOV R4,-(SP) ;CONTINUE FROM MOV R5,-(SP) ;A WARNING MESSAGE MOV #NULL,R4 ;DUMMY LINE IF COMMON INTERRUPT DEVICE BITB #LS.MDC,L.STS(R5) ;IS IT MULTIDRIVER CONTROLLER DEVICE BNE 12$ ;IF NE YES -- CAN'T TELL WHICH ONE MOV L.DCB(R5),R5 ;GET DCB ADDRESS OR COMMON INT TABLE BITB #LS.CIN,L.STS(R5) ;IS IT COMMON INTERRUPT CONTROLLER BEQ 11$ MOV CI.DCB(R5),R5 11$: MOV D.NAM(R5),XX ;PLACE NAME IN MESSAGE MOV #MESS4,R4 ;SPECIFY CORRECT MESSAGE 12$: SUB #2,R1 MOV R1,R2 SUB #4,R1 ;IS IT FATAL? BPL 15$ ;IF PL NO CALL $FATAL BR 17$ ;RENTER FLOW 15$: CALL WARN ;WARNING MESSAGE 17$: MOV #GETERR,R4 ; ADD R2,R4 ;POINT TO ERROR ADDRESS MOV (R4),R4 ;GET ACTUAL MESSAGE CALL WRITE MOV (SP)+,R5 ;RESTORE SAVED VALUES FROM MOV (SP)+,R4 ;BEFORE ERROR MESSAGE PRINTOUT MOV (SP)+,R2 MOV (SP)+,R0 BREAK ;AN ERROR CODE IS IN R1. .IFF ; DF R$$CON HALT ;HALT ON ERROR .IFTF ; DF R$$CON ; ; CHECK THE ERROR CODE IN R1 AND SEE WHAT IT MEANS BY CONSULTING THE ; TABLE OF $GETVC ERROR CODES BELOW. IF THE ERROR IS A WARNING, THEN ; YOU MAY PROCEED OR CONTINUE IF DESIRED. IF THE ERROR IS FATAL, DO ; NOT ATTEMPT TO PROCEED FURTHER. TAKE REMEDIAL ACTION AND TRY AGAIN. ; 20$: MOV R2,(R0)+ ;PLUG PC WORD INTO MEMORY CLR (R0) ;SET UP FOR PS WORD BISB K.CON(R4),(R0) ;PUT CONTROLLER NUMBER IN PS WORD ASR (R0) ;MAKE IT REAL NUMBER BIS #PR7,(R0) ;AND PRIORITY 7 INTERRUPT INITIALLY TST -(R0) ;BACK UP POINTER FOR GTVEC BR 10$ ;GET NEXT VECTOR 30$: ;REFERENCE LABEL .IFT ; DF R$$CON MOV (SP)+,$SCCTB ;SET CTB FOR STATUS CHANGE MOV (SP),$SCDEV ;SET UP KRB ARGUMENT FOR KRB STATUS CHG MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITION CALL $KRBSC ;CALL DRIVER AT STATUS CHANGE ENTRY ; ; ALL DEVICES THAT THIS ROUTINE DEALS WITH (I.E. DISKS, CONSOL TERMINALS, ; AND IIST) MUST NOT MAKE USE OF THE DELAYED RETURN FEATURE OF $KRBSC. ; IF, HOWEVER, THE KS.SLO BIT IS SET IN K.STS WE WILL WAIT (UP TO ABOUT ; 45 SECONDS) FOR THE DRIVER TO HANDLE THE SLOW CONTROLLER ONLINE TRANS- ; ITION. IT IS THE DRIVERS RESPONSIBILITY TO HANDLE INTERUPTS FROM THE ; CONTROLLER ($FORK MAY NOT BE CALLED) AND TO RESTORE $SCERR WHEN THE ; ONLINE IS COMPLETE. IF THE FOLLOWING "BREAK" IS ENCOUNTERED, THEN IT ; IS A SOFTWARE DESIGN PROBLEM, OR A BROKEN CONTROLLER IF KS.SLO IS SET, ; AND AN SPR SHOULD BE SUBMITTED. ; MOV (SP)+,R3 ;GET KRB ADDRESS BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER? BNE 31$ ;IF NE YES TST $SCDEV ;DID THE DRIVER FINISH UP? BEQ 40$ ;IF EQ YES BR 35$ ;NO, FATAL 31$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOP 32$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP 33$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE? BNE 40$ ;IF NE NO, IT'S FINISHED SOB R2,33$ ;INNER LOOP DELAY SOB R4,32$ ;OUTER LOOP DELAY 35$: MOV #MESS12,R4 ;SPECIFY MESSAGE FOR CONSOLE CALL $FATAL ;FATAL ERROR PRINTOUT MOV #MESS13,R4 ;SPECIFY ANOTHER MESSAGE CALL WRITE ;WRITE WITHOUT CR/LF FIRST MOV #MESS15,R4 CALL WRITLN ;WRITE WITH CR/LF FIRST BREAK FATAL 40$: MOV $SCCTB,R4 ;GET CTB ADDRESS FROM PREVIOUS CALL MOV R4,$TEMP1 ;SAVE CTB ADDRESS FOR LATER MOV L.NAM(R4),UU ;PLACE NAME IN MESSAGE MOV #UU+2,R2 ;SET INITIAL VALUE FOR CHARACTERS MOVB K.CON(R3),R5 ;GET CONTROLLER ID ASR R5 ;MAKE IT REAL ID CLR R4 ;SET UP FOR DIVIDE DIV #22.,R4 ;TWO POSSIBLE CHARACTERS BEQ 45$ ;IF EQ NO FIRST CHARACTER MOVB CTLET(R4),(R2)+ ;PLACE FIRST LETTER IN MESSAGE 45$: MOVB CTLET(R5),(R2)+ ;PLACE SECOND LETTER IN MESSAGE MOV R2,$TEMP0 ;SAVE POINTER INTO CONTROLLER MESSAGE CLRB (R2)+ ;SHOW END OF STRING BIT #KS.OFL,K.STS(R3) ;DID ONLINE FUNCTION WORK PROPERLY? BEQ 50$ ;IF EQ YES ; ; IF THE FOLLOWING BREAK IS ENCOUNTERED, THEN A DEVICE DIDN'T COME ; ONLINE PROPERLY. POSSIBLE CAUSES INCLUDE: THE CSR ADDRESS SPECIFIED ; IN THE KRB IS INCORRECT; THE DRIVER FOUND SOME CONDITION THAT PROHIBITS ; THE DEVICE FROM BEING USED; ETC. ; MOVB $SCERR,R1 ;PUT ERROR CODE IN R1 MOV #MESS16,R4 ;SPECIFY MESSAGE CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL MOV #MESS21,R4 ;ANOTHER MESSAGE CALL WRITE ;WRITE WITHOUT A CR/LF FIRST MOV #MESS17,R4 ;ANOTHER MESSAGE CALL WRITLN ;WRITE WITH A CR/LF AT FRONT OF MESSAGE BREAK FATAL ;DC410 .IFTF ;DF,R$$CON ;DC410 ONLINU: ;DC410 .IFT ;DF,R$$CON ;DC410 ;DC410 .IF DF,V$$DSK ; VIRTUAL DISK SUPPORT ;DC410 MOV R5,-(SP) ; SAVE UCB ADDRESS FOR BELOW ;DC410 CLR R3 ; AND NO KRB PRESENT ;DC410 .ENDC ;DF,V$$DSK ;DC410 50$: MOV (SP),$SCDEV ;SET UP FOR UCB STATUS CHANGE BNE 55$ ;IF UCB ADDRESS EXISTS -- PUT IT ONLINE TST (SP)+ ;CLEAN STACK RETURN ;GO HOME EARLY -- NO UCB ADDRESS 55$: MOV R3,-(SP) ;SAVE KRB ADDRESS MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITION CALL $UCBSC ;CALL DRIVER FOR STATUS CHANGE ; ; AS ABOVE, IF THE DRIVER DOESN'T RETURN IMMEDIATELY, THEN IT IS ; A SOFTWARE DESIGN ERROR. SUBMIT AN SPR IF YOU ENCOUNTER THE NEXT ; BREAK INSTRUCTION BELOW. ; MOV (SP)+,R3 ;GET KRB ADDRESS BEQ 555$ ; IF EQ, NO KRB, SHOULD BE DONE ;DC410 BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER? ;DC410 BNE 56$ ;IF NE YES ;DC410 555$: TST $SCDEV ;DID THE DRIVER FINISH UP? ;DC410 BEQ 60$ ;IF EQ YES ;**-3 BR 59$ ;NO, FATAL 56$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOP 57$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP 58$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE? BNE 60$ ;IF NE NO, IT'S FINISHED SOB R2,58$ ;INNER LOOP DELAY SOB R4,57$ ;OUTER LOOP DELAY 59$: MOV #MESS12,R4 ;SPECIFY MESSAGE TO PRINT ON CONSOLE CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL MOV #MESS14,R4 ;SPECIFY ANOTHER MESSAGE ON CONSOL CALL WRITE ;WRITE MESSAGE TO CONSOL MOV #MESS15,R4 ;ANOTHER MESSAGE CALL WRITLN ;WITH CR/LF FIRST BREAK FATAL 60$: MOV (SP)+,R5 ;GET UCB ADDRESS BITB #US.OFL,U.ST2(R5) ;WHAT IS ONLINE STATUS BEQ 70$ ;IF EQ DEVICE ONLINE ; ; THE DEVICE COULD NOT BE PUT ONLINE. THE ONLY REASON FOR THIS ; IS THAT THE DRIVER REJECTED THE ONLINE REQUEST. THE ERROR ; CODE FROM $SCERR IS IN R1. CORRECT THE CONDITION, AND TRY ; AGAIN. ; MOVB $SCERR,R1 ;PUT ERROR CODE WHERE XDT CAN SEE IT MOV $TEMP1,R3 ;RECOVER CTB ADDRESS BITB #LS.MDC,L.STS(R3) ;IS IT MULTIDRIVER CONTROLLER? BEQ 63$ ;IF EQ NO -- LEAVE CONTROLLER NAME AS IS MOV U.DCB(R5),R3 ;GET DCB ADDRESS MOV D.NAM(R3),UU ;PLACE DCB NAME INTO MESSAGE 63$: MOV $TEMP0,R3 ;SET POINTER TO CHARACTER STRING MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBER BIC #177707,R4 BEQ 65$ ;IF EQ NO DIGIT THERE ASR R4 ;PLACE DIGIT IN LOW PART OF BYTE ASR R4 ASR R4 ADD #'0,R4 ;MAKE INTO ASCII CHARACTER MOVB R4,(R3)+ ;PLACE CHARACTER IN SIMPLE 65$: MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBER BIC #177770,R4 ;GET MASK ADD #'0,R4 ;MAKE INTO NUMBER MOVB R4,(R3)+ ;PLACE INTO STRING MOVB #':,(R3)+ ;ADD COLON CLRB (R3)+ ;TERMINATE STRING MOV #MESS20,R4 ;SPECIFY MESSAGE FOR CONSOL PRINTOUT CALL $FATAL ;PRINT FATAL ERROR MOV #UU,R4 ;SPECIFY PHYSICAL UNIT NUMBER OF LOAD DEV CALL WRITE ;PRINT LINE MOV #MESS21,R4 ;ANOTHER MESSAGE CALL WRITE ;WRITE WITH NO CR/LF MOV #MESS17,R4 ;ANOTHER MESSAGE CALL WRITLN ;WRITE WITH CR/LF BREAK FATAL .ENDC ; DF R$$CON 70$: RETURN ;DC410 .DSABL LSB ;DC410 ; ;**-1 ; N O T E W E L L : ; ; THE FOLLOWING CODE HAS BEEN LIFTED DIRECTLY FROM THE MODULE ; SAVVEC.MAC. THE ONLY MODIFICATION MADE TO IT IS TO REMOVE ; THE GLOBAL SYMBOLS. IT SHOULD NOT BE FURTHER MODIFIED, SINCE ; IT IS IMPORTANT TO KEEP THIS CODE "EXACTLY" LIKE THE CODE IN ; SAVVEC.MAC. FURTHERMORE, ANY MODIFICATIONS TO SAVVEC SHOULD ; BE REFLECTED IN MODIFICATIONS TO THIS MODULE. ; ; ORIGINALLY LIFTED FROM SAVVEC.MAC 1-MAR-78. ; ; MOST RECENTLY UPDATED TO REFLECT CHANGES TO SAVVEC.MAC: ; ; K. E. KINNEAR 23-MAR-78 ; ; D. CARROLL 18-OCT-1995 - CONDITIONALIZED MP SUPPORT ;DC403 ; ;DC403 ; ; SPECIAL EQUATED SYMBOLS ; ; $GETVC ERROR CODES (MUST BE NONZERO) ; GT$E1==1*2 ;DRIVER NOT LOADED (FATAL) GT$E2==2*2 ;DRIVER DOES NOT SUPPORT CONTROLLER (FATAL) GT$E3==3*2 ;VECTOR TOO HIGH (WARNING) GT$E4==4*2 ;VECTOR IN USE (WARNING) GT$E5==5*2 ;UNIBUS RUN NOT ACCESSIBLE (WARNING) ; ; LOCAL DATA ; NONSI: .WORD $NONSI ;ADDRESSES OF EXECUTIVE NONSENSE INTERRUPT NS0: .WORD $NS0 ; ENTRY POINTS .WORD $NS1 ; .WORD $NS2 ; .WORD $NS3 ; .WORD $NS4 ; .WORD $NS5 ; .WORD $NS6 ; NS7: .WORD $NS7 ; ;+ ; **-GETVC-GET THE NEXT VECTOR ADDRESS ; ; THE INSTRUCTIONS IN THIS ROUTINE CANNOT BE MAPPED BY KISAR6 (THE ; VIRTUAL ADDRESSES MUST NOT BE BETWEEN 140000 AND 160000), BECAUSE ; THIS ROUTINE REMAPS (AND LATER RESTORES) KISAR6. ; ;*********************************************************************** ; CODE IN THIS MODULE IS DUPLICATED IN THE EXECUTIVE MODULE INITL. ANY ; BUG FIXES HERE MUST BE REPLICATED THERE!!!! ;************************************************************************ ; ; INPUTS: ; ; THIS ROUTINE IS CALLED AT SYSTEM STATE TO PROVIDE AN INTERLOCK ; ON THE VECTOR MANIPULATION. ; ; WHEN CALLED INITIALLY, ; R4 = ADDRESS OF KRB ; R5 = ADDRESS OF CTB ; (SP) = RETURN ADDRESS ; ; WHEN CALLED BACK AS A COROUTINE, ; IF R0<>0, VECTOR ADDRESS PRESERVED FROM LAST CALL ; IF R0=0, AFTER CLEANING UP THE STACK, $GETVC EXITS WITH ; C=1 ; R1=0 ; R0, R2, R3, R4, R5 PRESERVED AND NOT EXAMINED ; R4 = ADDRESS OF KRB PRESERVED FROM LAST CALL ; R5 = ADDRESS OF CTB PRESERVED FROM LAST CALL ; (SP) = RETURN ADDRESS ; ; OUTPUTS: ; ; IF C=0, $GETVC MAY BE CALLED AGAIN AS A COROUTINE (THERE MAY ; BE ANOTHER VECTOR ADDRESS TO BE RETURNED) ; R0 = VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6) ; IF R1=0, R0 AND R2 CAN BE USED AND ; Z=1 ; IF R1<>0, ERROR CODE (GT$E3, GT$E4, GT$E5) AND ; Z=0 ; R2 = PC WORD FOR VECTOR ; R3 = DESTROYED ; R4 = PRESERVED ; R5 = PRESERVED ; (SP) = TEMPORARY STORAGE ; 2(SP) = TEMPORARY STORAGE ; 4(SP) = CONTENTS OF KISAR6 AT INITIAL CALL ; 6(SP) = TEMPORARY STORAGE ; KISAR6 = MAPS R0 TO THE VECTOR ADDRESS ; ; IF C=1, $GETVC CANNOT BE CALLED AGAIN AS A COROUTINE ; R0 = MAY BE A VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6) ; IF R1=0, NO MORE VECTORS AND ; Z=1 ; IF R1<>0, ERROR CODE (GT$E1, GT$E2) AND ; Z=0 ; R2 = DESTROYED ; R3 = DESTROYED ; R4 = PRESERVED ; R5 = PRESERVED ; KISAR6 = RESTORED TO THE MAPPING AT THE TIME OF THE INITIAL CALL ;- GETVC: ;;ENTRY POINT MOV (SP),R3 ;;SAVE RETURN ADDRESS MOV L.ICB(R5),(SP) ;;SAVE ADDRESS OF FIRST ICB (OR 0) MOV @#KISAR6,-(SP) ;;RESERVE OTHER STACK LOCATIONS CLR -(SP) ;; CLR -(SP) ;; (ASSUME RESIDENT DRIVER) CLR R0 ;;FORM FIRST VECTOR ADDRESS/4 BISB K.VCT(R4),R0 ;; BEQ 42$ ;;IF EQ THERE ARE NO VECTORS ASL R0 ;;FORM FIRST VECTOR ADDRESS ASL R0 ;; MOV L.DCB(R5),R1 ;;GET POINTER TO A COMMON INTERRUPT ;; ROUTINE ADDRESS OR ADDRESS OF A DCB MOV (R1),R2 ;;GET COMMON INTERRUPT ROUTINE ADDRESS BITB #LS.CIN,L.STS(R5) ;;IS THIS A COMMON INTERRUPT DEVICE? BNE 60$ ;;IF NE YES MOV D.DSP(R1),R2 ;;GET ADDRESS OF DRIVER DISPATCH TABLE BEQ 98$ ;;IF EQ DRIVER IS NOT LOADED ; ; THE FOLLOWING CODE ASSUMES THAT THIS SYSTEM SUPPORTS LOADABLE ; DRIVERS (I.E., THAT D.PCB EXISTS). ALL M+ SYSTEMS SUPPORT ; LOADABLE DRIVERS. ; MOV D.PCB(R1),R1 ;;DRIVER RESIDENT OR LOADABLE? BEQ 10$ ;;IF EQ RESIDENT MOV P.REL(R1),(SP) ;;SAVE MAPPING TO DDT MOV (SP),@#KISAR6 ;;MAP TO DDT ADD #20000,R2 ;;BIAS POINTER TO USE KISAR6 10$: ADD #D.VINT,R2 ;;POINT AT FIRST CONTROLLER NAME ; ; SEARCH THE DDT FOR THE VECTOR AND INTERRUPT ENTRY POINT INFORMATION ; THAT APPLIES TO THIS CONTROLLER. THE DDT LOOKS LIKE: ; ; $XXTBL+D.VINT: CONTROLLER INFORMATION (NONZERO WORDS TERMINATED ; BY A ZERO WORD) ; .WORD $XYCTB ; ; CONTROLLER INFORMATION ; .WORD $XZCTB ; . ; . ; . ; ; $XXTBE:: .WORD 0 ; CLR R1 ;;INITIALIZE OFFSET TO NEXT VECTOR 20$: TST (R2) ;;REACHED END OF DDT? BEQ 150$ ;;IF EQ YES CMP L.NAM(R5),(R2) ;;FOUND INFO FOR THIS CONTROLLER? BEQ 40$ ;;IF EQ YES 30$: TST (R2)+ ;;PASSED OVER ALL INFO FOR CONTROLLER? BNE 30$ ;;IF NE NO TST (R2)+ ;;SKIP CTB POINTER BR 20$ ;; ; ; THE INFORMATION FOR EACH CONTROLLER LOOKS LIKE: ; ; .ASCII /XY/ ;CONTROLLER (CTB) MNEMONIC ; .WORD INTERRUPT ENTRY POINT ADDRESS (NONZERO AND EVEN) ; .WORD INTERRUPT ENTRY POINT ADDRESS OR ; VECTOR OFFSET (ODD) ; . ; . ; . ; .WORD 0 ; ; THERE MAY BE ZERO OR MORE WORDS OF INFORMATION BETWEEN THE ; CONTROLLER MNEMONIC AND THE TERMINATING ZERO WORD ; 40$: TST (R2)+ ;;POINT TO NEXT CONTROLLER INFO WORD TST (R2) ;;REACHED END OF CONTROLLER INFO? 42$: BEQ 120$ ;;IF EQ YES BIT #1,(R2) ;;IS ENTRY AN INTERRUPT ENTRY POINT ADDR BEQ 50$ ;;IF EQ YES MOV (R2),-(SP) ;;FORM VECTOR ADDRESS OFFSET DEC (SP) ;; CLR R1 ;;CLEAR DEFAULT VECTOR ADDRESS OFFSET ADD (SP)+,R0 ;;FORM NEW VECTOR ADDRESS BR 40$ ;; 50$: MOV R2,2(SP) ;;SAVE DDT POINTER ADD R1,R0 ;;FORM NEXT VECTOR ADDRESS MOV (R2),R2 ;;GET DRIVER INTERRUPT ENTRY POINT ADDR TST (SP) ;;IS THIS A RESIDENT DRIVER? BEQ 60$ ;;IF EQ YES MOV 6(SP),R2 ;;GET ICB POINTER 52$: MOV R2,R1 ;;COPY IT ASL R2 ;;FORM VIRTUAL ADDRESS MOV (R2)+,6(SP) ;;ASSUME NOT A MP/I&D SYSTEM ;; (ASSUME CURRENT MAPPING IS OKAY) .IF DF M$$PRO ;DC403 TSTB $NCPU ;;IS THIS A MULTIPROCESSOR SYSTEM? BEQ 60$ ;;IF EQ NO BIT #F2.DAS,$FMASK+2 ;;IS THIS AN I&D SPACE SYSTEM? BEQ 60$ ;;IF EQ NO BIC #7777,R1 ;;CLEAR VIRTUAL ADDRESS BITS SWAB R1 ;;FORM CPU NUMBER*2 OF ICB LINK ASR R1 ;; ASR R1 ;; ASR R1 ;; MOV $K6TAB(R1),@#KISAR6 ;;MAP TO ICB'S CPU POOL BIC #160000,R2 ;;CLEAR CPU NUMBER BITS BIS #140000,R2 ;;BIAS ICB POINTER TO USE APR6 BIT $URMTB(R1),K.URM(R4) ;;THIS ICB POINTER FOR THE CPU TO ;; WHICH THE DEVICE IS CURRENTLY ;; CONNECTED? BNE 54$ ;;IF NE YES MOV -(R2),R2 ;;GET NEXT ICB POINTER BR 52$ ;; 54$: MOV -(R2),6(SP) ;;SAVE POINTER TO NEXT ICB ADD #40002,R2 ;;REMOVE BIAS BITS AND FORM ;; ADDRESS OF ICB'S JSR .ENDC ;DF,M$$PRO ;DC403 ; ; VECTOR ADDRESS TOO HIGH FOR THIS SYSTEM? ; 60$: CMP $VECTR,R0 ;;VECTOR ADDRESS TOO HIGH? BLO 160$ ;;IF LO YES ;DC403 .IF DF M$$PRO ;DC403 ; ;**-1 ; MAP TO THE CORRECT CPU VECTOR AREA IF THIS IS A MULTIPROCESSOR ; CONFIGURATION ; MOVB $NCPU,R1 ;;GET NUMBER OF CPU'S IN SYSTEM BEQ 80$ ;;IF EQ THIS IS NOT A MULTIPROCESSOR ASL R1 ;;CONVERT TO A WORD INDEX 70$: SUB #2,R1 ;;CHECKED ALL OF PROCESSORS? BLT 170$ ;;IF LT YES BIT K.URM(R4),$URMTB(R1) ;;IS CONTROLLER ON THIS CPU? BEQ 70$ ;;IF EQ NO MOV $K6TAB(R1),@#KISAR6 ;;MAP TO VECTOR CONTEXT FOR CPU BIS #140000,R0 ;;BIAS VECTOR ADDRESS TO USE KISAR6 .ENDC ;DF,M$$PRO ;DC403 ; ;**-1 ; SEE IF VECTOR IS IN USE (DOES NOT POINT TO A NONSENSE INTERRUPT ; ENTRY POINT) ; 80$: MOV #NONSI,R1 ;;POINT TO TABLE OF NONSENSE ;; INTERRUPT ENTRY POINTS 90$: CMP (R1)+,(R0) ;;IS VECTOR IN USE? BEQ 100$ ;;IF EQ NO CMP #NS7,R1 ;;REACHED END OF TABLE BHIS 90$ ;;IF HIS NO ; ; VECTOR IN USE (WARNING) ; MOV #GT$E4,R1 ;;GET ERROR CODE BR 167$ ;;WARNING ; ; DRIVER NOT LOADED (FATAL) ; 98$: MOV #GT$E1,R1 ;;GET ERROR CODE BR 130$ ;; ; ; R2 CONTAINS WHAT SHOULD BE PUT INTO THE FIRST WORD OF THE VECTOR ; (PROGRAM COUNTER) IF THE CALLER IS INITIALIZING THE VECTOR. R2 IS ; ONE OF THE FOLLOWING ADDRESSES: ; ; 1) DRIVER INTERRUPT ENTRY POINT (RESIDENT DRIVER) ; 2) SECOND WORD OF AN INTERRUPT CONTROL BLOCK (LOADED DRIVER) ; 3) ENTRY POINT OF A COMMON INTERRUPT ROUTINE ; 100$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS CLR R1 ;;SHOW GOOD VECTOR ADDRESS (C=0) 110$: CALL @(SP)+ ;;CALL CALLER ; ; AT THIS POINT: ; ; (SP) = RETURN ADDRESS ; IF 2(SP)=0, RESIDENT DRIVER ; IF 2(SP)<>0, MAPPING TO DDT FOR LOADABLE DRIVER ; 4(SP) = ADDRESS OF LAST WORD EXAMINED IN DDT ; 6(SP) = INITIAL CONTENTS OF KISAR6 ; 10(SP) = ADDRESS OF NEXT ICB (OR 0) ; MOV (SP)+,R3 ;;SAVE RETURN ADDRESS TST R0 ;;CALLER WANT AN IMMEDIATE EXIT? BEQ 120$ ;;IF EQ YES BITB #LS.CIN,L.STS(R5) ;;A COMMON INTERRUPT CONTROLLER? BNE 120$ ;;IF NE YES -- ONLY ONE VECTOR MOV #4,R1 ;;GET DEFAULT VECTOR OFFSET MOV 2(SP),R2 ;;RESTORE POINTER TO DDT MOV (SP),@#KISAR6 ;;IF NECESSARY, REMAP TO DDT BIC #160000,R0 ;;CLEAR MAPPING BITS BR 40$ ;; 120$: CLR R1 ;;SHOW ALL VECTORS WERE FOUND 130$: CMP (SP)+,(SP)+ ;;CLEAR OFF STACK AND MOV (SP)+,@#KISAR6 ;;RESTORE INITIAL MAPPING MOV R1,(SP)+ ;; SET OR CLEAR Z-BIT SEC ;;SHOW CANNOT CALL AS A COROUTINE JMP (R3) ;;RETURN ; ; DRIVER DOES NOT SUPPORT CONTROLLER (FATAL) ; 150$: MOV #GT$E2,R1 ;;GET ERROR CODE BR 130$ ;; ; ; VECTOR TOO HIGH (WARNING) ; 160$: MOV #GT$E3,R1 ;;GET ERROR CODE 167$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS CLC ;;SHOW CAN CALL AS A COROUTINE BR 110$ ;; ;DC403 .IF DF M$$PRO ;DC403 ; ;**-1 ; UNIBUS RUN NOT ACCESSIBLE (WARNING) ; 170$: MOV #GT$E5,R1 ;;GET ERROR CODE BR 167$ ;; ;DC403 .ENDC ;DF,M$$PRO ;DC403 ; ; END OF DYNAMIC STORAGE REGION ; INEND: ;REFERENCE LABEL FOR END TO DEALLOCATE .BLKB 2 ;EXTRA FOR POSSIBLE ALIGNMENT CHANGE ; ; BEGINNING OF DYNAMIC STORAGE REGION ; .IF DF K$$DAS $ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST .WORD <<$ICTOP-$ICBEG>&177774> ;LENGTH OF FREE BLOCK ;DC403 .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE ;DC403 ;**-10 .IFF $SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE $SYTOP:: ;LAST ADDRESS IN EXECUTIVE .ENDC .END $INITL